package com.aco.fatureapp.service;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;

import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;

import com.aco.fatureapp.model.Leiturista;
import com.aco.fatureapp.model.Roteiro;
import com.aco.fatureapp.model.billing.LogLeitura;
import com.aco.fatureapp.utilitary.Utils;

public class SrvAutoSync extends Service {

	private static final String LOG_TAG = SrvAutoSync.class.getSimpleName();

	/*
	 * Parâmetros de consulta ao webservice.
	 */
	private List<NameValuePair> mParams = null;
	private SrvExportRoute mService;
	private Roteiro mRoteiro;

	/*
	 * (non-Javadoc)
	 *
	 * @see android.app.Service#onCreate()
	 */
	@Override
	public void onCreate() {

		mService = new SrvExportRoute();

		if (Utils.isInternetAvailable(this) && hasRoute()) {

			new AsyncTask<Void, Void, Void>() {

				@Override
				protected void onPreExecute() {
					preencherParametrosConsulta();
					super.onPreExecute();
				}

				@Override
				protected Void doInBackground(Void... params) {
					try {
						List<LogLeitura> lstLogLeitura = mService
								.getLogLeituraEnvioAutomatico();

						if (lstLogLeitura != null && !lstLogLeitura.isEmpty()) {

							String where = " INSCRICAO IN ( "
									+ buildWhereClause(lstLogLeitura) + " ) ";

							mService.execute(mParams, null, where);

							// colocar somente depois, para prevenir erro no
							// envio.
							for (LogLeitura log : lstLogLeitura) {
								log.setFlgEnvioAutomatico(Boolean.TRUE);
								log.save();
							}
						}
					}
					catch (Exception e) {
						Log.e(LOG_TAG, "Erro: " + e.getMessage(), e);
					}
					return null;
				}

			}.execute();
		}
	}

	@Override
	public void onDestroy() {
		mService.closeDB();
		super.onDestroy();
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see android.app.Service#onBind(android.content.Intent)
	 */
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}

	/**
	 * Monta uma string formada pelas inscrições separadas por vírgulas.
	 *
	 * @param lstLogLeitura
	 * @return
	 */
	private String buildWhereClause(final List<LogLeitura> lstLogLeitura) {
		final StringBuilder sb = new StringBuilder();

		for (final LogLeitura log : lstLogLeitura) {
			sb.append(log.getInscricao().toString());
			sb.append(", ");
		}

		return sb.toString().substring(0, sb.toString().lastIndexOf(","));
	}

	/**
	 * Verifica se tem roteiro disponível no equipamento.
	 *
	 * @return
	 */
	private boolean hasRoute() {
		mRoteiro = mService.findRoteiro();
		return mRoteiro != null;
	}

	/**
	 * Responsável por buscar e preencher uma lista com os parâmetros
	 * necessários para consumir o serviço de exportação.
	 */
	private void preencherParametrosConsulta() {
		this.mParams = new ArrayList<NameValuePair>();

		Leiturista usuarioLogado = SrvAccess.getUsuarioLogado(this,
				Leiturista.LEITURISTA);

		mParams.add(new BasicNameValuePair("idRoteiro", mRoteiro
				.getIdIntegracao().toString()));

		mParams.add(new BasicNameValuePair("imei", Utils.getImei(this)));

		mParams.add(new BasicNameValuePair("usuario", usuarioLogado.getCodigo()
				.toString()));

		mParams.add(new BasicNameValuePair("senha", usuarioLogado.getSenha()));

	}
}
